package com.gestion.dao;

import com.gestion.dao.interfaces.IPagoDAO;
import com.gestion.modelo.dominio.Pago;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * @author Mauri@<itsoluciones.com.ar>
 */
public class PagoDAO implements IPagoDAO {

    //<editor-fold defaultstate="collapsed" desc="Patrón SINGLETON">
    private static PagoDAO INSTANCIA = null;

    private static void crearInstancia() {
        INSTANCIA = new PagoDAO();
    }

    /**
     *
     * @return
     */
    public static PagoDAO getInstancia() {
        if (INSTANCIA == null) {
            crearInstancia();
        }
        return INSTANCIA;
    }

    private PagoDAO() {
        //System.out.println(this.toString());
    }
    //</editor-fold>

    /**
     * Hace persistente un Pago 
     * @param p
     * @return
     */
    @Override
    public Pago insertar(Pago p) {
        String sql = "INSERT INTO pago ("
                + "fecha, verificado )"
                + "VALUES(?,?)";
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            //atributo FECHA
            ps.setDate(1, p.datetoSqldate(p.getFecha()));
            //atributo PAGO verificado
            ps.setBoolean(2, p.isVerificado());
            //System.out.println("Imprimo sentencia SQL " + ps.toString());
            ps.executeUpdate();

            ps = FabricaDAO.getConnection().prepareStatement("SELECT * FROM pago ORDER BY id_pago DESC LIMIT 1");
            ResultSet rs = ps.executeQuery();
//            System.out.println(rs.toString());
            //<editor-fold defaultstate="collapsed" desc="Acá está el PAGO creado e INSERTADO en la BD">
            if (rs.first()) {
                //System.out.println("Largo = " + rs.getString("id_pago"));
                //ps.getConnection().setAutoCommit(true);
                return getPorId(rs.getLong("id_pago"));
            }
            //</editor-fold>
            return null;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    /**
     *
     * @param valorId
     * @return
     */
    @Override
    public Pago getPorId(Long valorId) {
        String sql = "SELECT * FROM pago WHERE id_pago = ?";
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ps.setLong(1, valorId);
            ResultSet rs = ps.executeQuery();
            if (rs.first()) {
                Pago pago;
                //Pago(Long id, boolean pagado, Date fecha, Pedido pedido)
                pago = new Pago(rs.getLong("id_pago"),
                        rs.getBoolean("verificado"),
                        rs.getDate("fecha"));
                //      PedidoDAO.getInstancia().getPorId(valorId));
                return pago;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    /**
     *
     * @param pago
     * @return
     */
    @Override
    public Pago modificar(Pago pago) {
        String sql = "UPDATE pago SET  "
                + "id_pago = ?, "
                + "fecha = ? ,"
                + "verificado = ? "
                + "WHERE id_pago = ? ";
        try {
            // Se crea el objeto PreparedStatement.
            // Este precompila la sentencatia SQL especificada.
            // Los signos de interrogación señalan el lugar en que deben establecerse los
            // parámetros antes de que se ejecute la sentencia.
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            // Se establecen los parámetros y se ejecuta la sentencia.
            ps.setLong(1, pago.getId());
            ps.setDate(2, pago.datetoSqldate(pago.getFecha()));
            ps.setBoolean(3, pago.isVerificado());
            ps.setLong(4, pago.getId());
            System.out.println(ps.toString());
            ps.executeUpdate();
            return pago;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }

    }

    /**
     *
     * @return
     */
    @Override
    public List<Pago> getTodos() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
